|
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**) ОТДЕЛ ПолеВвода;
(*============================================================================*
* НАЗНАЧЕНИЕ: ввод строки текста
*============================================================================*)
ИСПОЛЬЗУЕТ
Надел,
Поле,
Подложка,
Холст,
Черта,
Кнопка,
Записка,
Памятка,
Вывод ИЗ "..\Обмен\",
Ввод ИЗ "..\Обмен\";
(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
ПЕР
код:ЦЕЛ;
УКАЗ
ДЛЯ посылка ВИДА
| Ввод.ОтКлавиш:
код:=посылка.код;
посылка.код:=0; (* скорее всего отработаем посылку *)
ВЫБРАТЬ код ИЗ
| 1BH: поле.состояние:=Поле.сОтмена (* Esc *)
| 79H: поле.состояние:=Поле.сДалее (* F10 *)
| 0DH: поле.состояние:=Поле.сДалее (* Ent *)
ИНАЧЕ
посылка.код:=код
КОН
| Кнопка.Посылка:
поле.состояние:=посылка.кнопка.действие
ИНАЧЕ
КОН
КОН Приём;
(******************************************************************************)
ЗАДАЧА Выполнить-(
(* Цель: осуществить ввод строки текста *)
(******************************************************************************)
(* До: *)
заголовок-:ЦЕПЬ; (* заголовок подложки *)
колонок:ЦЕЛ; (* желаемая ширина строки ввода *)
окружение:Поле.Доступ;(* окружающее поле *)
номерСправки:ЦЕЛ; (* номер справки или 0 *)
примечание-:ЦЕПЬ; (* дополнительное примечание *)
(* Примечение: если <цепь> = "", то начальное значение берётся из памятки *)
(* После: *)
цепь+:ЦЕПЬ (* полученный текст *)
(* Ответ: *)
):ЦЕЛ; (* состояние поля после отработки *)
(******************************************************************************)
ПОСТ
(* цепочки для кнопок *)
цДалее ="[ Далее ]";
цОтмена="[ Отмена ]";
длДалее =ДЛИНА(цДалее);
длОтмена=ДЛИНА(цОтмена);
промежуток=2; (* промежуток между кнопками *)
занято=длДалее+промежуток+длОтмена;
ПЕР
поле:Поле.Доступ;
подложка:Подложка.Доступ;
черта:Черта.Доступ;
холст:Холст.Доступ;
записка:Записка.Доступ;
кнДалее,кнОтмена:Кнопка.Доступ;
позДалее,позОтмена:ЦЕЛ;
УКАЗ
(* вычисление местоположения кнопок *)
ЕСЛИ занято > колонок ТО
колонок:=занято
КОН;
позДалее:=2 + (колонок-занято+1) ДЕЛИТЬ 2;
позОтмена:=позДалее + длДалее + промежуток;
(* создаём поле *)
поле:=Поле.Создать(0,0,8,колонок+4,окружение,ВКЛ,Приём);
(* создаём наделы *)
подложка:=Подложка.Создать(0,0,0,0,заголовок);
ЕСЛИ цепь # "" ТО
холст:=Холст.СоздатьСтроку(2,2,-2,ПУСТО);
Холст.СтрокуИзЦепи(холст,цепь)
ИНАЧЕ
холст:=Холст.СоздатьСтроку(2,2,-2,Памятка.Найти(заголовок))
КОН;
записка:=Записка.Создать (3,2,2,-2,примечание);
черта:=Черта.Создать (-3,0,1,0);
кнДалее:=Кнопка.Создать (-2,позДалее,цДалее,Поле.сДалее,ВКЛ);
кнОтмена:=Кнопка.Создать (-2,позОтмена,цОтмена,Поле.сОтмена,ВКЛ);
(* добавляем наделы вс порядке отрисовки и получения ввода *)
Поле.ДобавитьНадел(поле,подложка);
Поле.ДобавитьНадел(поле,холст);
Поле.ДобавитьНадел(поле,записка);
Поле.ДобавитьНадел(поле,черта);
Поле.ДобавитьНадел(поле,кнДалее);
Поле.ДобавитьНадел(поле,кнОтмена);
(* основная работа *)
Поле.Рисовать(поле);
ПОВТОРЯТЬ
Поле.Проверить(поле)
ДО поле.состояние # Поле.сРабота;
(* восстанавливаем окружение *)
Поле.Рисовать(окружение);
(* перебрасываем данные *)
ЕСЛИ поле.состояние = Поле.сДалее ТО
Холст.СтрокуВПамятку(холст);
Холст.СтрокуВЦепь(холст,цепь)
КОН;
ВОЗВРАТ поле.состояние
КОН Выполнить;
КОН ПолеВвода.
|
|